package com.example.jedis.redis;

import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;

/**
 *  Redis map相关命令
 */
public class RedisMapCommand {
    Jedis jedis = null;
    public RedisMapCommand(Jedis jedis){
        this.jedis = jedis;
    }

    /**
     * HSET key field value

     将哈希表 key 中的域 field 的值设为 value 。

     如果 key 不存在，一个新的哈希表被创建并进行 HSET 操作。

     如果域 field 已经存在于哈希表中，旧值将被覆盖。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(1)
     返回值：
     如果 field 是哈希表中的一个新建域，并且值设置成功，返回 1 。
     如果哈希表中域 field 已经存在且旧值已被新值覆盖，返回 0 。
     * @param mapName
     * @param key
     * @param value
     */
    public Long hset(String mapName,String key,String value){
        return this.jedis.hset(mapName,key,value);
    }

    /**
     * 同时将多个 field-value (域-值)对设置到哈希表 key 中。

     此命令会覆盖哈希表中已存在的域。

     如果 key 不存在，一个空哈希表被创建并执行 HMSET 操作。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(N)， N 为 field-value 对的数量。
     返回值：
     如果命令执行成功，返回 OK 。
     当 key 不是哈希表(hash)类型时，返回一个错误。

     * @param mapName
     * @param kvs
     */
    public String  hmset(String mapName,Map kvs){
       return  this.jedis.hmset(mapName,kvs);
    }

    /**
      返回哈希表 key 中，一个或多个给定域的值。

     如果给定的域不存在于哈希表，那么返回一个 nil 值。

     因为不存在的 key 被当作一个空哈希表来处理，所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(N)， N 为给定域的数量。
     返回值：
     一个包含多个给定域的关联值的表，表值的排列顺序和给定域参数的请求顺序一样。
     * @param mapName
     * @param keys
     * @return
     */
    public  List<String> hmget(String mapName,String ...keys){
        List<String> list = this.jedis.hmget(mapName,keys);
        return list;
    }
    /**
     * 将哈希表 key 中的域 field 的值设置为 value ，当且仅当域 field 不存在。

     若域 field 已经存在，该操作无效。

     如果 key 不存在，一个新哈希表被创建并执行 HSETNX 命令。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(1)
     返回值：
     设置成功，返回 1 。
     如果给定域已经存在且没有操作被执行，返回 0 。
     * @param mapName
     * @param key
     * @param value
     */
    public Long hsetnx(String mapName,String key,String value){
        return this.jedis.hsetnx(mapName,key,value);
    }

    /**
     * 返回哈希表 key 中给定域 field 的值。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(1)
     返回值：
     给定域的值。
     当给定域不存在或是给定 key 不存在时，返回 nil 。

     * @param mapName
     * @param key
     * @return
     */
    public String hget(String mapName,String key){
       String value =  this.jedis.hget(mapName,key);
       return value;
    }

    /**
     * 查看哈希表 key 中，给定域 field 是否存在。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(1)
     返回值：
     如果哈希表含有给定域，返回 1 。
     如果哈希表不含有给定域，或 key 不存在，返回 0 。

     * @param mapName
     * @param key
     * @return
     */
    public Boolean hexists(String mapName,String key){
        return this.jedis.hexists(mapName,key);
    }

    /**
     * 删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。
     在Redis2.4以下的版本里， HDEL 每次只能删除单个域，如果你需要在一个原子时间内删除多个域，请将命令包含在 MULTI / EXEC 块内。
     可用版本：
     >= 2.0.0
     时间复杂度:
     O(N)， N 为要删除的域的数量。
     返回值:
     被成功移除的域的数量，不包括被忽略的域。

     * @param mapName
     * @param key
     * @return
     */
    public Long hdel(String mapName,String key){
        return this.jedis.hdel(mapName,key);
    }

    /**
     * HLEN key

     返回哈希表 key 中域的数量。

     时间复杂度：
     O(1)
     返回值：
     哈希表中域的数量。
     当 key 不存在时，返回 0 。
     * @param mapName
     */
    public Long hlen(String mapName){
        return this.jedis.hlen(mapName);
    }

    /**
    返回哈希表 key 中，所有的域和值。

     在返回值里，紧跟每个域名(field name)之后是域的值(value)，所以返回值的长度是哈希表大小的两倍。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(N)， N 为哈希表的大小。
     返回值：
     以列表形式返回哈希表的域和域的值。
     若 key 不存在，返回空列表。
     * @param mapName
     * @return
     */
    public Map hgetAll(String mapName){
        return this.jedis.hgetAll(mapName);
    }

    /**
     * 为哈希表 key 中的域 field 的值加上增量 increment 。

     增量也可以为负数，相当于对给定域进行减法操作。

     如果 key 不存在，一个新的哈希表被创建并执行 HINCRBY 命令。

     如果域 field 不存在，那么在执行命令前，域的值被初始化为 0 。

     对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。

     本操作的值被限制在 64 位(bit)有符号数字表示之内。

     可用版本：
     >= 2.0.0
     时间复杂度：
     O(1)
     返回值：
     执行 HINCRBY 命令之后，哈希表 key 中域 field 的值。
     * @param mapName
     * @param key
     * @param value
     * @return
     */
    public Long hincrBy(String mapName,String key,long value){
       return  this.jedis.hincrBy(mapName,key,value);
    }

}
